home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / MATH / VLN_20 / VLN23.PAS < prev    next >
Pascal/Delphi Source File  |  1995-03-30  |  5KB  |  156 lines

  1. unit vln23;     { a class of Very Large Number }
  2.  
  3. {))))))))))))))))))))))))))))))))))))))}
  4. {}          interface                 {}
  5. {))))))))))))))))))))))))))))))))))))))}
  6.  
  7.  
  8. uses  winprocs;
  9.  
  10. const
  11.    vlSize = 1000;     {a limit of about 2^16000  }
  12. { the working limit is wksize set in Unit Initialization }
  13.    vlmemsize = vlsize*4+4;
  14. type
  15.    pWordArray = ^tWordArray;
  16.    tWordArray = array[1..vlSize] of word;
  17.  
  18. type
  19.    WArray = array[0..16] of word;
  20.    pWArray = ^WArray;
  21.  
  22. type pchar4 = array[0..4]of char;
  23.  
  24. type
  25.   pVryLrgNo = ^tVryLrgNo;
  26.   tVryLrgNo = object
  27.     count : integer;
  28.     max : integer;
  29.     sign : integer;
  30.     tVLN : tWordArray;
  31.  
  32.     constructor Init( cnt, maxC, sgn : integer; pnew :pWordArray);
  33.  
  34.     procedure SetVal( cnt, sgn : integer; pnew :pWordArray);
  35.     procedure __SetWord( n : integer; nval : word );
  36.     function  __GetWord( n : integer) :  word ;
  37.  
  38.     procedure SetSmall(n:integer); { set immediate to 16 bits, signed }
  39.     procedure Clear( n : integer);
  40.  
  41.     procedure AddBy(other : pVryLrgNo);
  42.     procedure AddN(n:integer);
  43.     procedure SubBy(other : pVryLrgNo);
  44.     procedure SubN(n:integer);
  45.     procedure TwosComplAbs( cnt : integer );
  46.     procedure Copy( other : pVryLrgNo );   { copy other into self }
  47.     procedure Recount;
  48.     procedure MulBy(other : pVryLrgNo);
  49.     procedure MulN(n:integer);
  50.     procedure DivN(n:integer);
  51.     function  FindnoBinDig : integer;        { how many binary digits }
  52.     procedure BigSHL(cnt  : integer);         {shift left by words }
  53.     procedure MultiSHL(sf_cnt : integer);         {shift left by words }
  54.     procedure Shr1Bit;         {shift right one bit}
  55.     procedure ShL1Bit;         {shift left one bit}
  56.     function  FindDivShift(other : pVryLrgNo) : integer;
  57.                                    {shift in prep for dividing}
  58.     procedure DivBy( dvsr, remnd : pVryLrgNo);
  59.     procedure SetRandom(binCnt  : integer);
  60.     procedure TwoNth(n:integer );
  61.     procedure TenNth(n:integer );
  62.     procedure NthRoot(n:integer );
  63.     procedure NthPower(n:integer );
  64.     procedure FastNthPower(n:integer );
  65.  
  66.     end;
  67.  
  68.   function MaxOfW(a,b : word) : word;
  69.   function IsGrEqAbs(n1, n2  : pVryLrgNo): boolean;  { true if n1>= n2 }
  70.   function IsEqAbs(n1, n2  : pVryLrgNo): boolean;
  71.       { true if n1= n2 }
  72.   procedure HexWord( w : word; var pS : pchar4);
  73.  
  74.   procedure SetWkSize(n:integer);   export;
  75.   function  GetWkSize : integer;    export;
  76.   procedure CloseTempRegs;          export;
  77.   procedure OpenTempRegs;           export;
  78.   procedure CallError(s:String);
  79.  
  80.   function GetCount( regNo  : integer ) : integer;  export;
  81.   function GetSign( regNo  : integer ) : integer;   export;
  82.   function FlipSign( regNo  : integer ) : integer;  export;
  83.  
  84.   procedure Register_OP ( Reg1, op, Reg2 : integer);  export;
  85.   procedure Number_OP( Reg1, op, aNum : integer);    export;
  86.   procedure Op_2Self( Reg1, op : integer);         export;
  87.   function  SetWord( Reg1, pos : integer; nval : word )
  88.              : integer;   export;
  89.   function  GetWord( Reg1, n : integer) :  word ;     export;
  90.  
  91.   function Compare( Reg1, op, Reg2 : integer ): boolean;   export;
  92.   function GetBinSize ( Reg1 : integer )  : integer;    export;
  93.   function FastDiv  ( dvnd , dvsr  : integer ) : integer;    export;
  94.   function DivByBillion( regNo : integer ) : longint;    export;
  95.             { new quotient is in Register 75 }
  96.  
  97.  
  98.   var
  99.       dec_10e9 ,       { divisor for Decimal printout}
  100.       decPointShift    {offset for fraction printout }
  101.                    : pVryLrgNo;
  102.       HighVar : integer;
  103.       vlnVars : array[0..99] of pVryLrgNo;
  104.       wksize : integer;
  105.  
  106. {))))))))))))))))))))))))))))))))))))))}
  107. {}           implementation           {}
  108. {))))))))))))))))))))))))))))))))))))))}
  109.  
  110.  
  111. {$I getset.inc}
  112. {$I arithm2.inc}
  113. {$I utils1.inc}
  114.  
  115.  
  116. {((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((}
  117. {            Unit initialization                        }
  118. {((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((}
  119. begin
  120.  
  121.    HighVar := 0;
  122.    for HighVar := 75 downto 0 do
  123.       vlnVars[HighVar] := nil;
  124.  
  125.  
  126.    getmem(dec_10e9, 10);    { 2 * (words + sign + count + max) }
  127.    getmem(decPointShift, 22);
  128.  
  129.    with dec_10e9^ do
  130.       begin
  131.        count := 2;
  132.        max := 2;
  133.        sign := 1;
  134.        tvln[1] := $CA00;        { = 1 * 10^9 }
  135.        tvln[2] := $3B9A;
  136.       end;
  137.  
  138.    with decPointShift^ do
  139.       begin
  140.        count := 8;
  141.        max := 8;
  142.        sign := 1;
  143.     tVLN[1] := $0;
  144.     tVLN[2] := $0;
  145.     tVLN[3] := $9f10;  { 10 ^ 36 gives 36 decimal precision}
  146.     tVLN[4] := $b34b;
  147.     tVLN[5] := $715;
  148.     tVLN[6] := $7bc9;
  149.     tVLN[7] := $97ce;
  150.     tVLN[8] := $c0;
  151.       end;
  152.  
  153.     wksize := 500;
  154.  
  155. end.
  156.